메소드 시그너쳐 리팩토링의 변경

 

섹션은 Change Method Signature  리팩토링 위에서 당신에게 포괄적인  overview 제공하고  how 리팩토링이 IntelliJ IDEA에서 사용될 있는가를 제공합니다.

개요


Change Method Signature 리팩토링은 메소드 시그너쳐에 만들어질 있는 여러 가지 다른 변경을 조합합니다.  

 

가능한 변경은 다음과 같습니다

 메소드 이름 변경
 
덧셈 매개 변수
 
매개 변수 제거
 
주문 매개 변수
 
리턴 타입 변경
 
매개변수 타입 변경
 
매개 변수 이름 변경


리팩토링은 생성자에도 적용 가능하지만 당신은 그들의 이름 또는 리턴 형태를 변경할 없습니다.
시그너쳐 자체를 변경하는 것에 따라서, IDEA 메소드의 모든 사용에 대해 탐색할 것이고, 전체 호출, 구현과 변경을 반영하기 위해 안전하게 변경될 있는 메소드의 overriding 바꿀 것입니다.  만일 매개 변수가 추가되면, 그것은 메소드 콜을 위해 사용되는 디폴트 값이 공급되어야만 합니다.


최종 개의 앞에서 서술한 항목에서 기술된 변경은 구현과 overriding이외에 메소드 콜에 영향을 미치지 않습니다.  만일 당신이 매개 변수 형태 또는 리턴 형태를 변경하고, 바뀌는 코드를 컴파일 하려고 하면 당신에게 에러 메시지가 프롬프트 입니다.  당신은 영향을 받는 메소드 또는 메소드 보디를 수동으로 변경해야만 것입니다.


메소드 시그너쳐을 변경하면 당신은 메소드 콜을 다루는 개의 옵션을 가집니다.   번째, Modify  실제로 메소드 콜을 변경합니다.   번째, Delegate via overloading method  기존 메소드의 시그너쳐을 바꾸고, 기존 메소드의 시그너쳐과 함께 새로운 메소드를 삽입합니다.   새로운 메소드는 새로운 시그너쳐과 함께 오래된 메소드에 콜을 포함합니다.

예를 들면, 우리는 다음의 클래스를 가집니다

 
    class AClass {
        public void methodA() {
            //some code here
        }
        public void methodB() {
            //some code here
        }
    }
 
    ...
 
    void foo (AClass aClass){
        aClass.methodA();
    }

 

그리고 타입 int 매개 변수를 추가하면서 methodA 시그너쳐을 Modify 결정합니다리팩토링 이후  클래스는 다음과 같이  것입니다:
 
    class AClass {
        public void methodA(int aParameter) {
            //some code here
        }
        public void methodB() {
            //some code here
        }
    }


추가된 매개 변수를 위해 디폴트 값을 추가하는 것에 따라 선택된 메소드의 인보케이션은 변경될 것입니다:

    void foo (AClass aClass){
        aClass.methodA(0);
    }
 

만일 당신이 Delegate via overloading method 선택하면 AClass 코드는 다르게 것입니다.

 
    class AClass {
       public void methodA() {
            methodA(0);
        }
 
        public void methodA(int aParameter) {
            //some code here
        }
        public void methodB() {
            //some code here
        }
    }
 
    ...
 
    void foo (AClass aClass){
        aClass.methodA();
    }



메소드 시그너쳐 변경


메소드 시그너쳐을 변경하기 위해서

 1.   Project, 다른 보기인 Commander 에서 메소드를 선택하거나 또는 문서 편집기에서 리펙토되는 메소드 이름에서 캐럿을 위치시키고, 다음 팝업 메뉴(클래스를 오른쪽 버튼 클릭하여) 또는 메인 Menu Bar 어느 쪽으로부터 Ctrl + F6 누르고 OR Refactor Change Signature... 클릭합니다.
 2.   다음 다이얼로그 윈도우는 리팩토링 매개 변수를 지정하기 위해 나타날 것입니다:

이름

 

텍스트 필드에서 당신은 메소드의 이름을 변경할 있습니다.

 

리턴 형태

 

텍스트 필드에서 당신은 메소드의 리턴 형태를 변경할 있습니다.

 

매개 변수

목록에서 당신은 선택된 메소드(각각 Add 또는 Remove 버튼을 사용하여) 대한 매개 변수를 추가 또는 제거할 있거나, 그들의 순서(각각 Move up 또는 Move down 버튼을 사용하여) 변경할 있습니다.  또한 당신은 상응하는 매개 변수 필드를 클릭하는 것에 의해 매개 변수의 타입을 편집하거나, 이름을 짓거나, 새롭게 입력할 있는 매개 변수를 위해 디폴트 값을 지정할 있습니다.  만일 매개 변수 형태 또는 이름이 부정확하면 당신에게 Incorrect Data 다이얼로그가 프롬프트 입니다.


만일 새로운 매개 변수가 추가되면, 그것은 메소드 콜을 위해 사용되는 디폴트 값이 제공되어야만 합니다.  그것이 없으면, 당신은 다음의 Incorrect Data 다이얼로그를 것입니다:


Any var 체크 박스가 선택되면, 만일 메소드 포인트에서 보여지는 타입과 함께 오로지 하나의 필드/매개변수/값이 있다면

IDEA 상응하는 매개 변수에 대해 적절한 타입과 함께 어떤 가용한 필드/매개변수/값을 호출하는 메소드에서 리팩토링 후에 찾아서 사용하려고 입니다. 만일 개의 구성소가 디폴트 보다 가용한 타입과 함께 있다면 값은 사용됩니다. 만일 Any var 체크 박스가 선택되면, 디폴트 값은 항상 적용될 것입니다.

시그너쳐 미리 보기

 

거기에서 당신은 변경이 적용되고 후에 나타날 것인 메소드 시그너쳐을 미리 보기할 있습니다.

 

변경된 미리 보기 사용


체크 박스를 선택하면 당신은 어떤 사용이 발견되었는지 추적하고, 그들의 교체를 승인하도록 허락합니다.   체크 박스가 선택되지 않을 , IDEA 교체를 자동적으로 수행합니다.


심지어 체크 박스가 선택되지 않았을 때도, 만일 발견된 사용이 어떤 읽기 전용 파일에서 존재하면 당신은 교체 사용을 확인하는 프롬프트가 당신에 대기될 입니다.


Refactoring Preview 다이얼로그(만일 그것이 나타나면)에서 당신은 수행된 변경을 분석할 있습니다.  리팩토링과 함께 진행하기 위해서, Do Refactor 클릭합니다그렇지 않다면 Cancel 클릭합니다. 상세한 것을 보려면 Refactoring Preview 보십시오.


 3.  OK 누릅니다, 그리고 메소드 시그너쳐은 변경될 것입니다.

 4.  당신이 Change Method Signature 이전의 베이스 클래스 메소드를 Override 하거나 또는 Implement하는 메소드를 Refactor 하려고 , 당신에게 다음의 다이얼로그가 경고될 입니다.




No 누르면 당신이 베이스 클래스 메소드를 바꾸지 않고 선택된 메소드만을 Refactor하도록 허락합니다.

Yes 누르면 당신이 베이스 클래스까지 모든 메소드를 변경하는 것을 허락합니다.  그러나, 만일 그것이 어떤 이유에서든 불가능하면 당신은 상응하는 오류 메시지를 것입니다, 예를 들면:



 5.   만일 Delegate via overloading method  선택되고 당신은 그런 코드를 가집니다 : 

 
        class A{
            public void method(){
                //some code
            };
        }
 
        class B extends A{
            public void method(){
                //some code
            };
        }
    

A 클래스(부모) 메소드에 적용된 리팩토링 후에

 
    class A{
        public void method(){
            method(1);
        }
 
        public void method(int param){
            //some code
        };
    }
 
    class B extends A{
        public void method(int param){
            //some code
        };
    }
    

A.method 변경되고, B.method 시그너쳐 또한 변경됩니다